// 引入 axios
import fetch from '@/utils/fetch.js'

/**
 * 获取列表数据
 * 调用方式：this.$store.dispatch('initList',obj)
 * obj: 必传，类型：String，包含3个字段
 * url: 必传，接口路径，示例：'a/factory/basicFactory/list',类型：String
 * data: 非必传，接口参数，默认为：{},类型：Object
 * module: 必传，所属模块名，类型：String
 */
// function initList({dispatch, commit}, obj) {
//   return new Promise((resolve, reject) => {
//     let module = obj.module
//     if (!module) {
//       let err = new Error('请传入所属模块字段module')
//       reject(err)
//     }
//     obj.method = 'post'
//     fetch(obj).then((res) => {
//       let listData = {
//         data: res.data,
//         module: module
//       }
//       commit('initList', listData)
//       resolve()
//     }).catch((err) => {
//       let listData = {
//         data: {},
//         module: module
//       }
//       commit('initList', listData)
//       reject(err)
//     })
//   })
// }

/**
 * 获取详情数据
 * 调用方式：this.$store.dispatch('initDetail',obj)
 * obj: 必传，类型：String，包含3个字段
 * url: 非必传，接口路径，示例：'a/factory/basicFactory/get/89bf75db6b974d8eaa6fdcc4f967c360',类型：String;
 *      不传则表示清空 该模块(module)下 详情数据（detailData）
 * data: 非必传，接口参数,默认为：{},类型：Object
 * clean: 非必传，是否清空，默认为：false,类型：Boolean
 * module: 必传，所属模块名，类型：String
 */

// function initDetail({dispatch, commit}, obj) {
//   return new Promise((resolve, reject) => {
//     let module = obj.module
//     if (!module) {
//       let err = new Error('请传入所属模块字段module')
//       reject(err)
//     }
//     if (obj.clean) {
//       let detailData = {
//         data: {},
//         module: module
//       }
//       commit('initDetail', detailData)
//       resolve()
//     } else {
//       obj.method = 'get'
//       fetch(obj).then((res) => {
//         let detailData = {
//           data: res.data,
//           module: module
//         }
//         commit('initDetail', detailData)
//         resolve()
//       }).catch((err) => {
//         let detailData = {
//           data: {},
//           module: module
//         }
//         commit('initDetail', detailData)
//         reject(err)
//       })
//     }
//   })
// }

/**
 * 保存详情数据
 * 调用方式：this.$store.dispatch('saveDetail',obj)
 * obj: 必传，类型：String，包含5个字段
 * url: 必传，接口路径，示例：'a/factory/basicFactory/save',类型：String
 * data: 非必传，接口参数,默认为：{}类型：Object
 */
// function saveDetail({dispatch, commit}, obj) {
//   return new Promise((resolve, reject) => {
//     let module = obj.module
//     obj.method = 'post'
//     fetch(obj).then((res) => {
//       if (module) {
//         let obj = {
//           module: module,
//           state: true
//         }
//         dispatch('setRefresh', obj)
//       }
//       resolve()
//     }).catch((err) => {
//       reject(err)
//     })
//   })
// }

/**
 * 删除列表数据
 * 调用方式：this.$store.dispatch('deleteList',obj)
 * obj: 必传，类型：String，包含3个字段
 * data: 非必传，接口参数,默认为：{}类型：Object
 * module: 非必传，所属模块名；不传则不设置刷新状态，类型：String
 */
// function deleteList({dispatch, commit}, obj) {
//   return new Promise((resolve, reject) => {
//     let module = obj.module
//     obj.method = 'post'
//     fetch(obj).then((res) => {
//       if (module) {
//         let obj = {
//           module: module,
//           state: true
//         }
//         dispatch('setRefresh', obj)
//       }
//       resolve()
//     }).catch((err) => {
//       reject(err)
//     })
//   })
// }

// 获取树形工厂、车间、班组
function getTreeList({dispatch, commit}) {
  fetch({
    method: 'get',
    url: 'a/factory/factory/nametree'
  }).then((res) => {
    let treeList = res.data
    commit('getTreeList', treeList)
  })
}

/**
 * 文件上传
 * 调用方式：this.$store.dispatch('importFile', data)
 * @param dispatch
 * @param commit
 * @param obj：必传，类型：Obejct
 * data：必传，请求参数，类型：formdata 文件对象
 * onUploadProgress：非必传，上传进度回调，类型：function
 * @returns {Promise<any>}
 */
function importFile({dispatch, commit}, obj) {
  return new Promise((resolve, reject) => {
    obj.method = 'post'
    obj.url = 'a/uploadhistory/uploadHistory/upload'
    if (obj.data) {
      fetch(obj).then((res) => {
        resolve(res.data)
      }).catch((err) => {
        reject(err)
      })
    } else {
      let error = new Error('请传入file对象')
      reject(error)
    }
  })
}

/**
 * 文件上传并保存信息
 * 调用方式：this.$store.dispatch('importFileSave', data)
 * @param dispatch
 * @param commit
 * @param obj：必传，类型：Obejct
 * data：必传，请求参数，类型：formdata 文件对象
 * onUploadProgress：非必传，上传进度回调，类型：function
 * @returns {Promise<any>}
 * */
function importFileSave({dispatch, commit}, obj) {
  return new Promise((resolve, reject) => {
    obj.method = 'post'
    obj.url = 'a/uploadhistory/uploadHistory/uploadAndSave'
    if (obj.data) {
      fetch(obj).then((res) => {
        resolve(res.data)
      }).catch((err) => {
        reject(err)
      })
    } else {
      let error = new Error('请传入file对象')
      reject(error)
    }
  })
}
/**
 * 获取信息并存储到state
 * 调用方式：this.$store.dispatch('saveData', obj)
 * @param dispatch
 * @param commit
 * @param obj：必传，类型：Object
 * url: 必传，请求路径，类型：String
 * method：必传，请求方式，类型：String
 * data：非必传，请求参数，默认为：{}，类型：Object
 * commit：非必传，commit方法名，类型：String
 * clean：非必传，类型：Boolean，为true时清空数据
 * module：非必传,不能和commit字段同时传入，需要存储的state模块名，默认全局，类型：String
 * state：非必传，未传commit字段时则为必传，需要存储的state字段名，类型：String
 * noCommit: 非必传，设置未：true，则不执行commit直接返回，默认为：false，类型：Boolean,
 * @returns {Promise<any>}
 */
function saveData({dispatch, commit}, obj) {
  return new Promise((resolve, reject) => {
    let saveData = {
      module: obj.module,
      state: obj.state
    }
    if (obj.clean === true) {
      saveData.data = {}
      dispatch('setState', saveData)
      resolve()
    } else {
      fetch(obj).then((res) => {
        saveData.data = res.data
        if (obj.noCommit === true) {
          resolve(res)
        } else if (!obj.commit) {
          dispatch('setState', saveData)
        } else {
          commit(obj.commit, saveData)
        }
        resolve(res.data)
      }).catch((err) => {
        reject(err)
      })
    }
  })
}

/**
 * 修改state 数据
 * 调用方式：this.$store.dispatch('setState', obj)
 * @param dispatch
 * @param commit
 * @param obj：必传，类型：Object
 * module：非必传，需要修改的state模块名，默认全局，类型：String
 * state：必传，需要修改的state字段名，类型：String
 * data：非必传，修改的值，默认为：''，类型：不限
 */
function setState({dispatch, commit}, obj) {
  return new Promise((resolve, reject) => {
    if (!obj.state) {
      let err = new Error('请传入state字段')
      reject(err)
    } else {
      commit('SetState', obj)
      resolve()
    }
  })
}
// 将actions 方法暴露到全局
export default {
  // initDetail,
  // saveDetail,
  // deleteList,
  // initList,
  getTreeList,
  importFileSave,
  importFile,
  saveData,
  setState
}
